package github

import (
	"encoding/json"
	"fmt"
	"log"
	"os"
	"path/filepath"
	"strings"
	"sync"
	"time"

	"github.com/wcbing/github-downloader/config"
)

// 拼接得到文件名
func replaceFileName(latestVersion, templates string) (fileName string) {
	tmpname := strings.ReplaceAll(templates, "{stripped_version}", latestVersion[1:])
	fileName = strings.ReplaceAll(tmpname, "{version_tag}", latestVersion)
	return fileName
}

func formatVersion(versionTag string) string {
	if versionTag[0] == 'v' || versionTag[0] == 'V' {
		return versionTag[1:]
	} else {
		return versionTag
	}
}

func formatFileName(name, version string) string {
	return fmt.Sprintf("%s_%s_%s.deb", name, version, config.Architecture)
}

func Check(packageName string, repo config.GithubRepo, localVersion string) (versionTag string) {
	wg := sync.WaitGroup{}
	repoUrl := config.Proxy + "https://github.com/" + repo.Repo
	versionTag = LatestVersionTag(repoUrl)
	fmt.Printf("%s: %s\n", packageName, versionTag)
	// 判断是否需要更新
	if localVersion != versionTag {
		releasesDownloadUrl := repoUrl + "/releases/download"
		// 确定本地文件目录并确保目录存在
		var fileDir = filepath.Join(config.OutputDir, packageName)
		if _, err := os.Stat(fileDir); os.IsNotExist(err) {
			if err := os.MkdirAll(fileDir, 0755); err != nil {
				log.Print(err)
			}
		}
		// 下载新版本文件
		fileUrl := fmt.Sprintf("%s/%s/%s", releasesDownloadUrl, versionTag, replaceFileName(versionTag, repo.FileTemplate))
		// filePath := filepath.Join(fileDir, fileName)
		version := formatVersion(versionTag)
		filename := formatFileName(packageName, version)
		filePath := filepath.Join(fileDir, filename)
		var downloaded bool
		var size string
		wg.Add(1)
		go func() {
			defer wg.Done()
			downloaded, size = Download(fileUrl, filePath)
			if downloaded {
				// 判断是否是新添加应用
				if localVersion == "" {
					fmt.Printf("└  Add: %s\n", versionTag)
				} else {
					fmt.Printf("└  update: %s -> %s\n", localVersion, versionTag)
					// 删除旧版本文件
					oldFilePath := filepath.Join(fileDir, formatFileName(packageName, localVersion))
					os.Remove(oldFilePath)
				}
				// 生成 app.json
				repo.AppJson["Version"] = version
				repo.AppJson["Filename"] = filename
				repo.AppJson["Torrent_address"] = filename + ".torrent"
				repo.AppJson["Update"] = time.Now().Format(time.DateTime)
				repo.AppJson["Size"] = size
				repo.AppJson["Contributor"] = "<https://gitee.com/spark-building-service/github>"
				// 打开输出文件
				outputFile, err := os.Create(filepath.Join(fileDir, "app.json.update"))
				if err != nil {
					fmt.Println("Error creating file:", err)
					return
				}
				defer outputFile.Close()
				// 使用 Encoder 并关闭 HTML 转义
				encoder := json.NewEncoder(outputFile)
				encoder.SetIndent("", "    ")
				encoder.SetEscapeHTML(false)
				// 将修改后的 JSON 数据写入文件
				if err := encoder.Encode(repo.AppJson); err != nil {
					fmt.Println("Error encoding JSON:", err)
					return
				}
			}
		}()
	}
	wg.Wait()
	// 返回版本号
	return versionTag
}
